package cn.dongqihong.framework.util;

/**
 * 短链接工具
 * 
 * @author DongQihong
 *
 */
public class ShortUrlUtil {
	/**
	 * 要使用的字符
	 */
	public final static String[] CHARS = { "a", "b", "c", "d", "e", "f", "g",
			"h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t",
			"u", "v", "w", "x", "y", "z", "0", "1", "2", "3", "4", "5", "6",
			"7", "8", "9", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J",
			"K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W",
			"X", "Y", "Z" };

	/**
	 * 根据链接生成短链接
	 * 
	 * @param url
	 *            源链接
	 * @return 短链接
	 */
	public static String[] generate(String url) {
		if (url == null) {
			return null;
		}
		String[] resStr = new String[4];
		// 先得到url的32个字符的md5码
		String md5 = MD5Util.encrypt(url);
		// 将32个字符的md5码分成4段处理，每段8个字符
		for (int i = 0; i < 4; i++) {
			int offset = i * 8;
			String sub = md5.substring(offset, offset + 8);
			// 将sub当作一个16进制的数，转成long
			long sub16 = Long.parseLong(sub, 16);
			// & 0X3FFFFFFF，去掉最前面的2位，只留下30位
			sub16 &= 0X3FFFFFFF;
			StringBuilder sb = new StringBuilder();
			// 将剩下的30位分6段处理，每段5位
			for (int j = 0; j < 6; j++) {
				// 得到一个 <= 61的数字
				long t = sub16 & 0x0000003D;
				sb.append(CHARS[(int) t]);
				sub16 >>= 5; // 将sub16右移5位
			}
			resStr[i] = sb.toString();
		}
		return resStr;
	}

	public static void main(String[] args) {
		String[] str = generate("http://blog.csdn.net/is_zhoufeng/article/details/21494281");
		for (String string : str) {
			System.out.println(string);
		}
	}

}
